
#ifndef PERSISTOR_H_
#define PERSISTOR_H_
#include "../Comunes/CadenaBytes.h"
#include <string.h>
#include <fstream>

/*
 * Clase para manejar los archivos mediante objetos de la clase
 * CadenaBytes.
 * Cada objeto persistor se corresponde con un unico archivo
 */
class Persistor {
private:
	fstream archivo;
	string ruta;
	int tamanioBloque;
	int tamanioArchivo;//indica el tamaño del archivo, con -1 se indica que no esta abierto

public:
	/*
	 * Constructor
	 */
	Persistor(string ruta, int tamanioBloque);

	/*
	 * Metodo que sirve para crear un archivo nuevo.
	 * Pre:
	 * Pos: El archivo queda creado, pero no abierto. Si lo creo sin problemas devuelve
	 * 		TRUE, de lo contrario, FALSE.
	 */
	bool crearArchivo ();

	/*
	 * Metodo que sirve para abrir el archivo
	 * Pre: El archivo debe existir
	 * Pos: Devuelve TRUE si lo pudo abrir bien, de lo contrario FALSE.
	 * 		Queda definido el tamanio del archivo
	 */
	bool abrirArchivo ();

	/*
	 * Metodo que sirve para cerrar el archivo.
	 * Pre:
	 * Pos: TRUE cerro el archivo correctamente, de lo contrario FALSE.
	 *
	 * HACEMOS ESTE METODO O DIRECTAMENTE LO CERRAMOS EN EL DESTRUCTOR???
	 */
	void cerrarArchivo();

	/*
	 * Metodo que renombra el archivo con el que se esta trabajando.
	 * Pre:-
	 * Pos: Renombra el archivo. En caso exitoso retorna 0, y sino
	 * 		retorna el errno.
	 * 		El archivo queda en el mismo estado en el que estaba antes
	 * 		(abierto o cerrado)
	 */
	int renombrarArchivo(string nueva_ruta);

	/*
	 * Metodo que remueve el archivo con el que se esta trabajando.
	 * Pre:-
	 * Pos: Remueve el archivo. En caso exitoso retorna 0, y sino
	 * 		retorna el errno.
	 * 		El archivo queda en el mismo estado en el que estaba antes
	 * 		(abierto o cerrado)
	 */
	int removerArchivo();

	/*
	 * Metodo que sirve para guardar un bloque en el archivo
	 * Pre:
	 * Pos:
	 */
	bool guardarBloque (int nroBloque, CadenaBytes cadena);

	/*
	 * Metodo que sirve para guardar n bloques en el archivo a partir
	 * del bloque n
	 * Pre: debe existir el espacio para guardar dichos bloques
	 * Pos: Quedan guardados los bloques pasados por argumento
	 * 		Retorna true si pudieron ser guardados y false en caso contrario.
	 */
	bool guardarNBloques(int nroPrimerBloque,int n, CadenaBytes cadena);

	/*
	 * Metodo que sirve para leer un bloque del archivo
	 * Pre: El numero de bloque debe ser valido
	 * Pos: Devuelve una el bloque leido en una "CadenaBytes".
	 * 		Si el numero de bloque es invalido o no se puede realizar la lectura
	 * 		se retorna un objeto "CadenaBytes" vacio
	 */
	CadenaBytes leerBloque (int nroBloque);

	/*
	 * Metodo que sirve para leer n bloques del archivo a partir del bloque
	 * dado por "nroPrimerBloque"
	 * Pre: El numero de bloque y la cantidad deben ser validos
	 * Pos: Devuelve una los n bloques leidos en una "CadenaBytes".
	 * 		Si el numero de bloque es invalido o no se puede realizar la lectura
	 * 		se retorna un objeto "CadenaBytes" vacio
	 */
	CadenaBytes leerNBloques(int nroPrimerBloque, int n);

	/*
	 * Metdo que agrega un nuevo bloque vacio al archivo.
	 * Pre:
	 * Pos:
	 */
	void agregarBloque ();

	/*
	 * Metodo que agrega una cantidad n de bloques vacios al
	 * final del archivo
	 * Pre: n debe ser >=1
	 * Pos: Quedan agregados n bloques vacios al final del archivo
	 */
	void agregarNBloques(int n);

	int getTamanioArchivo();

	int getCantidadBloques();

	string getRuta();

	/*
	 * Destructor
	 */
	virtual ~Persistor();
};

#endif /* PERSISTOR_H_ */
